// 得到 String 的 metaclass
MetaClass mc = String.metaClass

final Object[] NO_ARGS = []

assert 1 == mc.respondsTo("toString", NO_ARGS).size()
// 等价于 
assert 1 == mc.respondsTo(this, "toString", NO_ARGS).size()
// 查看对象 1 是否有 toString 方法. 即使 mc 是 String 的 metaclass, 这里传入 Integer 
// 也没问题, 但是最好不要这么干.
assert 1 == mc.respondsTo(1, "toString", NO_ARGS).size()

println mc.properties
println mc.methods.size()
println mc.metaMethods.size()

println mc.invokeMethod("aaa", "toString", NO_ARGS)
// 这里就出问题了, String 的 metaclass 中的 invokeMethod 方法不应该用于 Integer
// println mc.invokeMethod(1, "toString", NO_ARGS)

// The return value of the method which is null if the return type is void
assert null == mc.invokeStaticMethod(String, "println", NO_ARGS)

assert "a" == mc.invokeConstructor(['a'] as String[])
